#!/bin/bash

# Minecraft 基岩版服务器更新模块
# 描述：负责检测和更新基岩版Minecraft服务器

# 获取当前基岩版服务器版本
get_current_bedrock_version() {
    local server_dir="$BEDROCK_SERVER_DIR"
    local version_file="$server_dir/version.txt"
    local current_version="未知"
    
    # 首先尝试从version.txt文件获取版本
    if [ -f "$version_file" ]; then
        current_version=$(cat "$version_file")
    # 然后尝试从bedrock_server文件中提取版本信息
    elif [ -f "$server_dir/bedrock_server" ]; then
        # 使用strings命令提取版本字符串
        if command -v strings > /dev/null; then
            local version_line=$(strings "$server_dir/bedrock_server" | grep -E "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$" | head -1)
            if [ -n "$version_line" ]; then
                current_version="$version_line"
            fi
        fi
    fi
    
    echo "$current_version"
}

# 获取最新基岩版服务器版本信息
get_latest_bedrock_version() {
    local latest_version="未知"
    local temp_file="$TEMP_DIR/bedrock_version_check.tmp"
    local download_page_url="$BEDROCK_DOWNLOAD_PAGE_URL"
    local download_base_url="$BEDROCK_DOWNLOAD_BASE_URL"
    
    log_info "正在检查最新的基岩版服务器版本..."
    log_info "下载页面URL: $download_page_url"
    log_info "下载基础URL: $download_base_url"
    
    # 确保临时目录存在
    if [ -z "$TEMP_DIR" ]; then
        log_error "临时目录路径为空"
        TEMP_DIR="/tmp/minecraft_updater"
        log_warning "使用默认临时目录: $TEMP_DIR"
    fi
    
    mkdir -p "$TEMP_DIR"
    
    if [ -z "$download_page_url" ]; then
        log_error "下载页面URL为空"
        return 1
    fi
    
    if [ -z "$download_base_url" ]; then
        log_error "下载基础URL为空"
        return 1
    fi
    
    # 测试直接指定 URL
    log_info "测试直接访问下载页面..."
    if curl -s --head "$download_page_url" | head -1 | grep -q "HTTP/1.[01] [23]"; then
        log_info "下载页面URL可以访问"
    else
        log_warning "无法访问下载页面URL"
        log_info "尝试使用wget测试..."
        if wget --spider -q "$download_page_url"; then
            log_info "wget可以访问下载页面"
        else
            log_error "wget也无法访问下载页面"
        fi
    fi
    
    # 下载Minecraft基岩版服务器下载页面
    log_info "开始下载页面内容..."
    if download_file "$download_page_url" "$temp_file"; then
        log_info "下载页面成功"
        log_info "正在分析下载页面，提取版本信息..."
        
        # 尝试三种不同的提取方法
        log_info "方法1: 使用下载基础URL提取下载链接..."
        local download_url=$(grep -o "${download_base_url}[^\"]*" "$temp_file" | head -1)
        
        if [ -n "$download_url" ]; then
            log_info "找到下载链接: $download_url"
            latest_version=$(echo "$download_url" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1)
            log_info "提取的版本号: $latest_version"
        else
            log_warning "方法1失败，尝试方法2: 直接搜索服务器ZIP文件..."
            local zip_pattern="bedrock-server-[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\.zip"
            local zip_file=$(grep -o "$zip_pattern" "$temp_file" | head -1)
            
            if [ -n "$zip_file" ]; then
                log_info "找到ZIP文件名: $zip_file"
                latest_version=$(echo "$zip_file" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+')
                log_info "从ZIP文件名提取的版本号: $latest_version"
            else
                log_warning "方法2失败，尝试方法3: 直接搜索版本号..."
                latest_version=$(grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' "$temp_file" | head -1)
                
                if [ -n "$latest_version" ]; then
                    log_info "直接找到版本号: $latest_version"
                else
                    log_error "所有方法均失败，无法获取版本号"
                    log_info "调试信息: 下载基础URL: ${download_base_url}"
                    log_info "页面内容预览:"
                    head -30 "$temp_file"
                fi
            fi
        fi
    else
        log_error "无法下载基岩版服务器下载页面"
        log_warning "无法下载基岩版服务器下载页面，版本检测失败"
    fi
    
    if [ "$latest_version" = "未知" ]; then
        log_warning "无法获取最新版本信息"
    else
        log_info "检测到最新基岩版服务器版本: $latest_version"
    fi
    
    echo "$latest_version"
}

# 下载和安装基岩版服务器
download_and_update_bedrock_server() {
    local server_dir="$BEDROCK_SERVER_DIR"
    local temp_dir="$TEMP_DIR/bedrock_update"
    local target_version="$1"  # 这里可能是"latest"或特定版本号
    local download_url=""
    local download_page_url="$BEDROCK_DOWNLOAD_PAGE_URL"
    local download_base_url="$BEDROCK_DOWNLOAD_BASE_URL"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 准备下载和更新基岩版服务器"
    echo -e "操作: 创建临时目录并获取下载链接"
    echo -e "目标版本: $target_version"
    echo -e "下载基础URL: $download_base_url"
    echo -e "服务器目录: $server_dir"
    echo -e "=====================================================\e[0m"
    
    # 确保临时目录存在
    if [ -z "$TEMP_DIR" ]; then
        echo -e "\e[1;31m错误: 临时目录路径为空\e[0m"
        log_error "临时目录路径为空"
        TEMP_DIR="/tmp/minecraft_updater"
        echo -e "\e[1;33m使用默认临时目录: $TEMP_DIR\e[0m"
    fi
    
    # 创建临时目录
    mkdir -p "$temp_dir"
    
    if [ -z "$download_base_url" ]; then
        echo -e "\e[1;31m错误: 下载基础URL为空\e[0m"
        log_error "下载基础URL为空"
        download_base_url="https://www.minecraft.net/bedrockdedicatedserver/bin-linux/"
        echo -e "\e[1;33m使用默认下载基础URL: $download_base_url\e[0m"
    fi
    
    # 获取下载URL
    if [ "$target_version" = "latest" ]; then
        echo -e "\e[1;36m目标: 获取最新版本\e[0m"
        log_info "正在获取最新基岩版服务器下载链接..."
        
        # 下载Minecraft基岩版服务器下载页面
        local download_page="$temp_dir/download_page.html"
        if download_file "$download_page_url" "$download_page"; then
            echo -e "\e[1;36m正在从页面提取下载链接...\e[0m"
            
            # 尝试多种方法提取下载链接
            # 方法1: 使用基础URL
            download_url=$(grep -o "${download_base_url}[^\"]*" "$download_page" | head -1)
            
            if [ -n "$download_url" ]; then
                # 从URL中提取版本号
                target_version=$(echo "$download_url" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1)
                log_info "找到版本 $target_version 的下载链接"
                echo -e "\e[1;32m成功找到下载链接: $download_url\e[0m"
            else
                echo -e "\e[1;33m方法1失败，尝试方法2: 搜索ZIP文件名...\e[0m"
                
                # 方法2: 搜索ZIP文件名
                local zip_file=$(grep -o "bedrock-server-[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\.zip" "$download_page" | head -1)
                if [ -n "$zip_file" ]; then
                    echo -e "\e[1;32m找到ZIP文件名: $zip_file\e[0m"
                    target_version=$(echo "$zip_file" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+')
                    download_url="${download_base_url}${zip_file}"
                    echo -e "\e[1;32m构建下载链接: $download_url\e[0m"
                else
                    echo -e "\e[1;33m方法2失败，尝试方法3: 直接搜索版本号...\e[0m"
                    
                    # 方法3: 直接搜索版本号
                    target_version=$(grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' "$download_page" | head -1)
                    if [ -n "$target_version" ]; then
                        echo -e "\e[1;32m找到版本号: $target_version\e[0m"
                        download_url="${download_base_url}bedrock-server-${target_version}.zip"
                        echo -e "\e[1;32m构建下载链接: $download_url\e[0m"
                    else
                        echo -e "\e[1;31m无法获取版本信息，请尝试使用--version参数指定版本\e[0m"
                        log_error "无法获取版本信息，请尝试使用--version参数指定版本"
                        return 1
                    fi
                fi
            fi
        else
            log_error "无法下载基岩版服务器下载页面"
            echo -e "\e[1;31m无法下载基岩版服务器下载页面\e[0m"
            echo -e "\e[1;31m无法自动获取最新版本，请使用--version参数指定版本\e[0m"
            return 1
        fi
    else
        # 对于特定版本，我们需要构建一个可能的下载URL
        echo -e "\e[1;36m目标: 使用指定版本 $target_version\e[0m"
        log_info "使用指定版本 $target_version 的基岩版服务器"
        download_url="${download_base_url}bedrock-server-$target_version.zip"
        echo -e "\e[1;32m使用构建的下载链接: $download_url\e[0m"
    fi
    
    if [ -z "$download_url" ]; then
        log_error "无法获取下载链接，更新失败"
        echo -e "\e[1;31m无法获取下载链接，更新失败\e[0m"
        echo -e "\e[1;31m请使用--version参数指定版本\e[0m"
        return 1
    fi
    
    if [ -z "$target_version" ]; then
        log_error "无法确定目标版本，更新失败"
        echo -e "\e[1;31m无法确定目标版本，更新失败\e[0m"
        echo -e "\e[1;31m请使用--version参数指定版本\e[0m"
        return 1
    fi
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 下载基岩版服务器文件"
    echo -e "操作: 将从 $download_url 下载服务器文件"
    echo -e "目标版本: $target_version"
    echo -e "=====================================================\e[0m"
    
    # 下载服务器压缩包
    local zip_file="$temp_dir/bedrock-server.zip"
    if ! download_file "$download_url" "$zip_file"; then
        echo -e "\e[1;31m下载基岩版服务器失败\e[0m"
        log_error "下载基岩版服务器失败"
        
        # 尝试直接使用curl下载
        echo -e "\e[1;33m尝试最后一次下载...\e[0m"
        if curl -A "$USER_AGENT" -L --fail -o "$zip_file" "$download_url"; then
            echo -e "\e[1;32m下载成功\e[0m"
        else
            echo -e "\e[1;31m下载失败\e[0m"
            echo -e "\e[1;31m请检查网络连接或版本号是否正确\e[0m"
            return 1
        fi
    fi
    
    # 检查下载文件大小
    local file_size=$(stat -c %s "$zip_file" 2>/dev/null || stat -f %z "$zip_file")
    echo -e "\e[1;36m下载文件大小: $file_size 字节\e[0m"
    
    if [ "$file_size" -lt 1000000 ]; then  # 1MB
        echo -e "\e[1;31m下载的文件太小，可能不是有效的服务器包\e[0m"
        log_error "下载的文件太小，可能不是有效的服务器包"
        return 1
    fi
    
    # 创建版本文件
    echo "$target_version" > "$temp_dir/version.txt"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 停止当前服务器"
    echo -e "操作: 正在安全停止运行中的服务器实例"
    echo -e "=====================================================\e[0m"
    
    # 停止服务器
    stop_server "$BEDROCK_SESSION_NAME" "stop"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 备份当前服务器"
    echo -e "操作: 创建服务器完整备份以便恢复"
    echo -e "=====================================================\e[0m"
    
    # 备份当前服务器
    create_backup "$server_dir" "bedrock"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 解压新版本服务器"
    echo -e "操作: 将下载的服务器文件解压到临时目录"
    echo -e "=====================================================\e[0m"
    
    log_info "正在解压更新包..."
    
    # 创建临时解压目录
    local extract_dir="$temp_dir/extracted"
    mkdir -p "$extract_dir"
    
    # 检查unzip是否可用
    if ! command -v unzip > /dev/null; then
        log_error "未找到unzip命令，请安装unzip工具"
        return 1
    fi
    
    # 解压服务器文件
    if ! unzip -q "$zip_file" -d "$extract_dir"; then
        log_error "解压服务器文件失败"
        return 1
    fi
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 保留现有配置文件"
    echo -e "操作: 备份世界数据和服务器配置"
    echo -e "=====================================================\e[0m"
    
    log_info "保留服务器配置文件..."
    
    # 需要保留的文件列表
    local preserve_files=(
        "server.properties"
        "permissions.json"
        "allowlist.json"
        "whitelist.json"  # 旧版兼容
        "worlds"
    )
    
    # 创建保留文件目录
    mkdir -p "$temp_dir/preserved/"
    
    # 备份保留文件
    for file in "${preserve_files[@]}"; do
        if [ -e "$server_dir/$file" ]; then
            cp -r "$server_dir/$file" "$temp_dir/preserved/"
        fi
    done
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 更新服务器文件"
    echo -e "操作: 删除旧文件并复制新文件"
    echo -e "=====================================================\e[0m"
    
    log_info "更新服务器文件..."
    
    # 删除旧服务器文件，但保留配置
    find "$server_dir" -type f -not -path "$server_dir/worlds/*" \
                       -not -name "server.properties" \
                       -not -name "permissions.json" \
                       -not -name "allowlist.json" \
                       -not -name "whitelist.json" \
                       -delete
    
    # 复制新文件
    cp -r "$extract_dir"/* "$server_dir/"
    
    # 复制版本文件
    cp "$temp_dir/version.txt" "$server_dir/"
    
    # 确保服务器文件有执行权限
    chmod +x "$server_dir/bedrock_server"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 清理临时文件"
    echo -e "操作: 删除下载和解压的临时文件"
    echo -e "=====================================================\e[0m"
    
    # 清理临时目录
    rm -rf "$temp_dir"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 服务器更新完成"
    echo -e "操作: ${BEDROCK_AUTO_RESTART}=='true'?'自动重启服务器':'等待手动重启'}"
    echo -e "=====================================================\e[0m"
    
    # 启动服务器（如果配置了自动重启）
    if [ "$BEDROCK_AUTO_RESTART" = "true" ]; then
        start_server "$server_dir" "$BEDROCK_SESSION_NAME" "$BEDROCK_START_COMMAND"
    else
        log_info "服务器已更新，但未自动重启（自动重启已禁用）"
    fi
    
    return 0
}

# 主更新函数
update_bedrock_server() {
    local server_dir="$BEDROCK_SERVER_DIR"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 开始基岩版服务器更新流程"
    echo -e "操作: 检查服务器目录和当前版本"
    echo -e "服务器目录: $server_dir"
    echo -e "=====================================================\e[0m"
    
    # 验证服务器目录存在
    if [ ! -d "$server_dir" ]; then
        log_error "基岩版服务器目录不存在: $server_dir"
        return 1
    fi
    
    # 获取当前版本
    local current_version=$(get_current_bedrock_version)
    log_info "====================================================="
    log_info "当前基岩版服务器版本: $current_version"
    log_info "====================================================="
    
    # 如果配置了特定版本，则使用特定版本
    if [ -n "$BEDROCK_VERSION" ]; then
        echo -e "\e[1;33m====================================================="
        echo -e "步骤: 使用配置中指定的版本"
        echo -e "目标版本: $BEDROCK_VERSION"
        echo -e "=====================================================\e[0m"
        
        log_info "使用配置中指定的版本: $BEDROCK_VERSION"
        download_and_update_bedrock_server "$BEDROCK_VERSION"
        
        # 发送通知
        send_notification "基岩版" "$current_version" "$BEDROCK_VERSION"
        
        return $?
    else
        echo -e "\e[1;33m====================================================="
        echo -e "步骤: 检查最新版本"
        echo -e "操作: 获取并比较最新版本信息"
        echo -e "=====================================================\e[0m"
        
        # 获取最新版本
        local latest_version=$(get_latest_bedrock_version)
        
        # 如果无法获取最新版本，退出
        if [ "$latest_version" = "未知" ]; then
            log_error "无法获取最新版本信息，更新失败"
            return 1
        fi
        
        echo -e "\e[1;33m====================================================="
        echo -e "步骤: 版本比较"
        echo -e "当前版本: $current_version"
        echo -e "最新版本: $latest_version"
        echo -e "=====================================================\e[0m"
        
        # 比较版本
        if [ "$current_version" != "$latest_version" ] && [ "$current_version" != "未知" ]; then
            log_info "====================================================="
            log_info "版本比较: 当前版本[$current_version] ≠ 最新版本[$latest_version]"
            log_info "发现新版本，正在准备更新..."
            log_info "====================================================="
            
            echo -e "\e[1;33m====================================================="
            echo -e "步骤: 更新到最新版本"
            echo -e "目标版本: $latest_version"
            echo -e "=====================================================\e[0m"
            
            download_and_update_bedrock_server "latest"
            
            # 发送通知
            send_notification "基岩版" "$current_version" "$latest_version"
            
            return $?
        else
            log_info "====================================================="
            log_info "版本比较: 当前版本[$current_version] = 最新版本[$latest_version]"
            log_info "服务器已经是最新版本，无需更新"
            log_info "====================================================="
            
            echo -e "\e[1;33m====================================================="
            echo -e "结果: 服务器已是最新版本"
            echo -e "版本: $current_version"
            echo -e "无需更新"
            echo -e "=====================================================\e[0m"
            
            return 0
        fi
    fi
} 